package tracksystem;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import managesystem.Buddy;
import managesystem.Student;
//import controlsystem.BadgeController;
import managesystem.StudentManager;

/**
 * Deze klasse behandeld de informatie dat door de gebruiker ingevuld wordt
 * wanneer er gekozen wordt voor een schoolactiviteit te tracken.
 * 
 * @author Jannes Janssens en Incalza Dario
 * 
 */
abstract public class TrackServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	private int seconds;
	private int minutes;
	private String place;
	private String type;
	private int rating;
	private String comment;
	private String description;
	private ArrayList<Buddy> buddies = new ArrayList<Buddy>();
	private String[] distr;
	private String[] aids;
	private String url;

	/**
	 * Load the form info into this servlet's fields.
	 */
	protected void getFormInfo(HttpServletRequest req, Student currStud) {

		this.seconds = Integer.valueOf(req.getParameter("seconds"));
		this.minutes = Integer.valueOf(req.getParameter("minutesinseconds"));
		this.place = req.getParameter("place");
		this.type = req.getParameter("type");
		this.rating = Integer.valueOf(req.getParameter("rating"));
		this.comment = req.getParameter("comment");
		this.description = req.getParameter("description");
		// Haal de, eventueel meerdere, buddies op.
		String[] buddies = req.getParameterValues("buddies");
		// Verwijder lege of dubbele entries
		ArrayList<String> listBuds = new ArrayList<String>();
		for (String b : buddies)
			if (!b.isEmpty() && !b.equals("")) {
				for (String s : listBuds) {
					if (!s.equals(b))
						listBuds.add(b);
				}
			}
		this.aids = listBuds.toArray(new String[listBuds.size()]);

		// Omzetten naar buddyObjects
		parseBuddies(buddies, currStud);
		// Haal de aids & distr op
		// Haal de aids & distr op
		String[] aids = req.getParameterValues("aids");
		String[] distr = req.getParameterValues("distr");
		// Verwijder lege entries uit deze twee arrays
		ArrayList<String> listAids = new ArrayList<String>();
		for (String s : aids)
			if (!s.isEmpty())
				listAids.add(s);
		this.aids = listAids.toArray(new String[listAids.size()]);

		ArrayList<String> listDistr = new ArrayList<String>();
		for (String s : distr)
			if (!s.isEmpty())
				listDistr.add(s);
		this.distr = listDistr.toArray(new String[listDistr.size()]);
	}

	/**
	 * Afhandelen van de informatie van het formulier
	 */
	public void doPost(HttpServletRequest req, HttpServletResponse resp) {
		HttpSession session = req.getSession();
		Student currStud = (Student) session.getAttribute("currStud");
		this.getFormInfo(req, currStud);
		handle(req, resp, currStud, session);
	}

	protected void handle(HttpServletRequest req, HttpServletResponse resp,
			Student currStud, HttpSession session) {

		/**
		 * De originele activiteit terug ophalen
		 */
		Activity tempAct = currStud.getUnfinishedActivity();
		if (tempAct.equals(null)) {
			/**
			 * Fout! Om een activiteit op te slaan moet er al een tijdelijke
			 * activiteit gemaakt zijn
			 */
			session.setAttribute("error", "Something went terribly wrong!");
			try {
				resp.sendRedirect("/index.jsp");
			} catch (IOException e) {
				e.printStackTrace();
			}
			return;
		}
		if (url == null) {
			url = "/index.jsp";
		}
		updateSpec(tempAct, currStud);
		session.setAttribute("message", "SchoolActivity tracked succesfully");
		session.setAttribute("currStud", currStud);
		try {
			resp.sendRedirect(url);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	/**
	 * Lelijke oplossing voor het feit dat de update van de child's aangeroepen
	 * moet worden vanuit deze klasse. Om daarna ook nog de update van deze
	 * parent class aan te roepen zijn verschillende namen nodig.
	 */
	abstract protected void updateSpec(Activity tempAct, Student currStud);

	protected void update(Activity tempAct, Student currStud) {
		tempAct.setStopDate(seconds+minutes);
		tempAct.setComment(comment);
		tempAct.setRating(rating);
		tempAct.setPlace(place);
		tempAct.setType(type);
		tempAct.setDescription(description);
		tempAct.setBuddies(buddies);
		tempAct.setAids(aids);
		tempAct.setDistractions(distr);
		currStud.addActivity(tempAct);
		StudentManager.add(currStud);// update het student object

	}

	private void parseBuddies(String[] ids, Student currStud) {
		List<Buddy> studBuddies = currStud.getBuddies();
		for (int i = 0; i < ids.length; i++) {
			for (Buddy b : studBuddies) {
				if (Integer.valueOf(ids[i]) == b.getId()) {
					buddies.add(b);
				}
			}
		}
	}

	public void setURL(String url) {
		this.url = url;
	}
}